package com.lihan.config;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.springframework.stereotype.Component;

import java.sql.*;
import java.util.Arrays;
import java.util.List;

/**
 * 自定义MyBatis类型处理器 - 实现List<String>与数据库字符串的相互转换
 *
 * 功能：将Java中的List<String>类型与数据库中以特定分隔符拼接的字符串进行双向转换
 * 典型应用场景：存储图片地址列表、标签列表等需要保存多个值的字段
 */
@Component
public class StringListTypeHandler extends BaseTypeHandler<List<String>> {

    // 定义数据库字符串的分隔符
    private static final String DELIMITER = ",";

    /**
     * 将Java对象转换为数据库字段值（非null时调用）
     *
     * @param ps PreparedStatement对象
     * @param i 参数位置（第i个占位符）
     * @param parameter 待转换的List<String>对象
     * @param jdbcType JDBC类型（此处未使用）
     *
     * 示例：["img1.jpg", "img2.jpg"] -> "img1.jpg,img2.jpg"
     */
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, 
                                   List<String> parameter, JdbcType jdbcType) throws SQLException {
        String joined = String.join(DELIMITER, parameter);
        ps.setString(i, joined);
    }

    /**
     * 从数据库结果集中通过列名获取字段值，并转换为List<String>
     *
     * @param rs 数据库结果集
     * @param columnName 数据库列名
     * @return List<String>对象（可能为null）
     *
     * 示例："img1.jpg,img2.jpg" -> ["img1.jpg", "img2.jpg"]
     */
    @Override
    public List<String> getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String value = rs.getString(columnName);
        return value != null ? Arrays.asList(value.split(DELIMITER)) : null;
    }

    /**
     * 从数据库结果集中通过列索引获取字段值，并转换为List<String>
     *
     * @param rs 数据库结果集
     * @param columnIndex 列索引（从1开始）
     */
    @Override
    public List<String> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String value = rs.getString(columnIndex);
        return value != null ? Arrays.asList(value.split(DELIMITER)) : null;
    }

    /**
     * 从存储过程调用结果中获取字段值，并转换为List<String>
     *
     * @param cs 存储过程调用结果集
     * @param columnIndex 列索引
     */
    @Override
    public List<String> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        String value = cs.getString(columnIndex);
        return value != null ? Arrays.asList(value.split(DELIMITER)) : null;
    }
}